package com.qingcloud.api.dcengine.service;

import com.qingcloud.api.dcengine.dto.TablePageDTO;
import com.qingcloud.api.dcengine.dto.aggregation.DomainAvgPollutionData;
import com.qingcloud.api.dcengine.dto.aggregation.DomainAvgValidDay;
import com.qingcloud.api.dcengine.dto.aggregation.SimpleAvgPollutionData;
import com.qingcloud.api.dcengine.dto.sdata.CommonStationData;
import com.qingcloud.api.dcengine.dto.sdata.StationOverLimitData;
import com.qingcloud.api.dcengine.dto.sdata.StationValidCount;
import com.qingcloud.api.dcengine.dto.sdata.StationValidData;
import com.qingcloud.api.dcengine.model.sdata.*;
import com.qingcloud.api.dcengine.service.fallback.StationDataApiFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
 * 监测点数据接口
 */
@FeignClient(name = "station-data-api", url = "${data-url}",
        fallback = StationDataApiFallback.class)
public interface StationDataApi {

    /**
     * 分钟数据通用列表接口
     */
    @PostMapping("/sdata/minute/list")
    List<CommonStationData> minuteList(@RequestBody StationDataListParam listParam);

    /**
     * 分钟数据通用分页查询接口
     */
    @PostMapping("/sdata/minute/page")
    TablePageDTO<CommonStationData> minutePage(@RequestBody StationDataPageParam pageParam);

    /**
     * 5分钟数据通用列表接口
     */
    @PostMapping("/sdata/five/list")
    List<CommonStationData> fiveList(@RequestBody StationDataListParam listParam);

    /**
     * 5分钟数据通用分页查询接口
     */
    @PostMapping("/sdata/five/page")
    TablePageDTO<CommonStationData> fivePage(@RequestBody StationDataPageParam pageParam);

    /**
     * 10分钟数据通用列表接口
     */
    @PostMapping("/sdata/ten/list")
    List<CommonStationData> tenList(@RequestBody StationDataListParam listParam);

    /**
     * 10分钟数据通用分页查询接口
     */
    @PostMapping("/sdata/ten/page")
    TablePageDTO<CommonStationData> tenPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 监测点小时数据通用列表接口
     */
    @PostMapping("/sdata/hour/list")
    List<CommonStationData> hourList(@RequestBody StationDataListParam listParam);

    /**
     * 小时数据通用分页查询接口
     */
    @PostMapping("/sdata/hour/page")
    TablePageDTO<CommonStationData> hourPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 统计数据质控小时数据数量
     */
    @PostMapping("/sdata/validHour/count")
    int countValidHour(@RequestBody StationValidListParam listParam);

    /**
     * 数据质控小时数据列表查询
     */
    @PostMapping("/sdata/validHour/list")
    List<StationValidData> validHourList(@RequestBody StationValidListParam listParam);

    /**
     * 数据质控小时数据分页查询接口
     */
    @PostMapping("/sdata/validHour/page")
    TablePageDTO<StationValidData> validHourPage(@RequestBody StationValidPageParam pageParam);

    /**
     * 天数据通用列表接口
     */
    @PostMapping("/sdata/day/list")
    List<CommonStationData> dayList(@RequestBody StationDataListParam listParam);

    /**
     * 天数据通用分页查询接口
     */
    @PostMapping("/sdata/day/page")
    TablePageDTO<CommonStationData> dayPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 统计数据质控天数据数量
     */
    @PostMapping("/sdata/validDay/count")
    int countValidDay(@RequestBody StationValidListParam listParam);

    /**
     * 数据质控天数据列表查询
     */
    @PostMapping("/sdata/validDay/list")
    List<StationValidData> validDayList(@RequestBody StationValidListParam listParam);

    /**
     * 数据质控天数据分页查询接口
     */
    @PostMapping("/sdata/validDay/page")
    TablePageDTO<StationValidData> validDayPage(@RequestBody StationValidPageParam pageParam);

    /**
     * 更新小时数据某个污染物的有效性
     *
     * @return 更新的数据数量
     */
    @PostMapping("/sdata/updateValid/hour")
    int updateHourValid(List<UpdateStationValidParam> validParamList);

    /**
     * 更新天数据某个污染物的有效性
     *
     * @return 更新的数据数量
     */
    @PostMapping("/sdata/updateValid/day")
    int updateDayValid(List<UpdateStationValidParam> validParamList);

    /**
     * 月数据通用列表接口
     */
    @PostMapping("/sdata/month/list")
    List<CommonStationData> monthList(@RequestBody StationDataListParam listParam);

    /**
     * 月数据通用分页查询接口
     */
    @PostMapping("/sdata/month/page")
    TablePageDTO<CommonStationData> monthPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 天数据按时间聚合平均接口
     */
    @PostMapping("/sdata/hour/avg/time")
    List<SimpleAvgPollutionData> hourAvgByTime(@RequestBody StationDataListParam listParam);

    /**
     * 天数据按时间聚合平均接口
     */
    @PostMapping("/sdata/day/avg/time")
    List<SimpleAvgPollutionData> dayAvgByTime(@RequestBody StationDataListParam listParam);

    /**
     * 指定站点每天的平均数据查询
     */
    @PostMapping("/sdata/day/avg/data")
    List<CommonStationData> findStationAvgDayData(@RequestBody StationDataListParam stationDataListParam);

    /**
     * 指定站点均值查询接口
     */
    @PostMapping("/sdata/avg/data")
    CommonStationData findStationAvgData(@RequestBody StationDataListParam stationDataListParam);

    /**
     * 指定站点年均值统计
     */
    @PostMapping("/sdata/year/data")
    CommonStationData findStationYearData(@RequestBody StationDataListParam stationDataListParam);

    /**
     * 站点每天数据按区县平均列表数据
     *
     * @param listParam 站点列表参数对象
     * @return 指定站点下的区县均值
     */
    @PostMapping("/sdata/day/avg/district/list")
    List<DomainAvgPollutionData> dayAvgByDistrictList(@RequestBody StationDataListParam listParam);

    /**
     * 站点每天数据按区县平均分页数据
     *
     * @param pageParam 分页站点均值数据参数
     * @return 指定站点下的区县分页数据
     */
    @PostMapping("/sdata/day/avg/district/page")
    TablePageDTO<DomainAvgPollutionData> dayAvgByDistrictPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 站点小时数据按污染物最大值站点编号排序
     *
     * @param pageParam 分页站点均值数据参数
     * @return 分页返回的站点编号
     */
    @PostMapping("/sdata/hour/max/value/station")
    TablePageDTO<String> hourMaxValueOrderStation(@RequestBody StationMaxValueOrderPageParam pageParam);

    /**
     * 站点每天数据按区县平均的有效天数列表
     *
     * @param listParam 站点列表参数对象
     * @return 有效天数列表
     */
    @PostMapping("/sdata/day/avg/valid/day/list")
    List<DomainAvgValidDay> dayAvgByDistrictValidDayList(@RequestBody StationDataListParam listParam);

    /**
     * 站点每天数据按区县平均的有效天数分页数据
     *
     * @param pageParam 分页站点均值数据参数
     * @return 有效天数列表分页数据
     */
    @PostMapping("/sdata/day/avg/valid/day/page")
    TablePageDTO<DomainAvgValidDay> dayAvgByDistrictValidDayPage(@RequestBody StationDataPageParam pageParam);

    /**
     * 站点小时数据超标统计
     *
     * @param pageParam 参数对象
     * @return 超标统计数据
     */
    @PostMapping("/sdata/hour/over/limit/page")
    TablePageDTO<StationOverLimitData> hourOverLimitPage(@RequestBody StationOverLimitPageParam pageParam);

    /**
     * 站点小时数据超标总次数
     *
     * @return 超标总次数
     */
    @PostMapping("/sdata/hour/over/limit/sum")
    Integer sumHourOverLimit(@RequestBody StationOverLimitParam param);

    /**
     * 小时据按时间聚合加权平均接口
     *
     * @param listParam
     * @return
     */
    @PostMapping("/sdata/hour/wavg/time")
    List<SimpleAvgPollutionData> hourWeightAvgByTime(@RequestBody StationDataListParam listParam);

    /**
     * 天数据按时间聚合加权平均接口
     */
    @PostMapping("/sdata/day/wavg/time")
    List<SimpleAvgPollutionData> dayWeightAvgByTime(@RequestBody StationDataListParam listParam);

    /**
     * 站点小时数据有效性统计
     */
    @PostMapping({"/sdata/hour/valid/count"})
    List<StationValidCount> hourValidCount(@RequestBody StationDataListParam listParam);

    /**
     * 站点天数据有效性统计
     */
    @PostMapping({"/sdata/day/valid/count"})
    List<StationValidCount> dayValidCount(@RequestBody StationDataListParam listParam);

}
